package com.ys.day27.p2阻塞队列;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 描述:
 * 我们之前学习的队列都是非阻塞队列，如何理解非阻塞？当某个队列为空，你还进行get()相关的操作，要么抛出异常，要么返回null值，总之程序会结束。
 * <p>
 * ​        什么是阻塞队列？
 * <p>
 * ​	阻塞有两种：1 当队列为空的情况下，进行take()操作，此时程序不会结束一直阻塞(等待)
 * <p>
 * ​				2 当队列容量已满，还在进行put()操作，此时程序不会结束一直阻塞(等待)
 * <p>
 * ​	非阻塞？程序会继续执行，直到结束。阻塞：程序不会继续执行而是一直等待。
 * <p>
 * ​        线程池支持的队列都是阻塞队列，有哪些呢？
 * <p>
 * ​	1）LinkedBlockingQueue：是一个基于链表的阻塞队列。它的内部结构跟LinkedList一样，只是LinkedList的本质是非阻塞的，而它是阻塞的队列
 * <p>
 * ​	支持的构造方法有两个：
 * <p>
 * ​	LinkedBlockingQueue() : 表示一个无界限的阻塞队列，如何理解无界限？我使用无参构造方法创建该对象，容器(集合)的大小是Integer最大值
 * <p>
 * ​	LinkedBlockingQueue(int) : 表示以指定的容量创建一个无界限队列，例如：LinkedBlockingQueue(3)表示该容器(集合)的大小不能超过3个。
 *
 * @author CodeYang
 * @version 2021/1/6 19:41
 */
public class P1BlockingQueue阻塞队列的应用与了解 {


    public static void main(String[] args) {
        function01();
        function02();
    }

    /**
     * 2:如果队列为空了,我们直接去拿,也会因为没有元素而直接阻塞
     *  我们要先取走,才可以继续放入.
     */
    private static void function02() {
    }

    /**
     * 1阻塞队列的已满情况去继续添加
     */
    private static void function01() {
        // 阻塞队列的接口 BlockingQueue  实现类  LinkedBlockingQueue
        // 一: 无界限阻塞队列 LinkedBlockingQueue<>();  因为其底层初始化其队列的实际元素长度是int 类型
        // 所以最长可以为 2的31次方-1 int类型最大值Integer.MAX_VALUE
        /**
         *  public LinkedBlockingQueue() {
         *         this(Integer.MAX_VALUE);
         *     }
         */
        // 二:有界限的阻塞队列,即 new 队列时指定容器的长度 如:
        //场景：创建一个有参的LinkedBlockingQueue对象，大小为3。观察向容器添加4个元素会发生什么情况？
        BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(3);

        try {
            // 使用阻塞队列添加元素时,可能会因为阻塞时间太长,而中断
            queue.put(1);
            queue.put(2);
            queue.put(3);
            // 队列的最大长度为3 我们此时再添加一个元素看会怎么样?
            // 此时因为没有拿走元素,所有节点都已经忙,所以此刻会一直阻塞在此
            // 还是符合: FIFO 特征的
            queue.take();
            queue.put(5);

            System.out.println(queue);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
